﻿/*
 * 支付宝沙箱支付示例
 * 2022/12
 * 
 * 一、Nuget包：AlipaySDKNet.Standard
 * 
 * 二、操作步骤
 * 0、需要对支付宝应用开发中创建应用和配置密钥
 * 1、appsettings.json文件中配置了支付宝支付需要的一些参数（appid、私钥、支付公钥、网关、字符编码、签名类型等）
 * 2、写了一个配置帮助类（AliPayConfigHelper)：这个类的作用主是去读取配置文件，获取各个配置节点信息
 * 3、写一个支付宝支付类，里面有一个支付方法（方法体中具体怎么写可以参考官网的示例代码-找C#语言的  https://opendocs.alipay.com/apis/api_1/alipay.trade.wap.pay）
 *    代码的功能实现，主要就三点：
 *    1）创建DefaultAopClient实例并初始化
 *    2）创建请求支付API的对象并构建Model参数
 *    3）发送请求及处理响应或异常
 * **/
using Aop.Api;
using Aop.Api.Request;
using Aop.Api.Response;
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Max.PH5_2006.ShoppingSite.Common.Pay
{
    public class AlipayPay : IPay
    {
        readonly AliPayConfig config;
        public AlipayPay()
        {
            config = new AliPayConfig();
        }

        public Tuple<bool,string> Pay()
        {
            try
            {
                //1、创建DefaultAopClient实例并初始化
                IAopClient client = new DefaultAopClient(
                    config.GatewayUrl,
                    config.AppId,
                    config.PrivateKey,
                    "json",
                    "1.0",
                    config.SignType,
                    config.AlipayPublicKey,
                    config.Charset,
                    false
                );

                //2、构建model参数（更多参数列表和意思，具体的可以参考官网：https://opendocs.alipay.com/apis/api_1/alipay.trade.wap.pay）
                Dictionary<string, object> bizContent = new()
                {
                    { "out_trade_no", "20210817010101004" },  //商户的订单号
                    { "total_amount", 0.01 },   //金额：是以元为单位
                    { "subject", "测试商品" },  //主题
                    { "product_code", "QUICK_WAP_WAY" }  //支付宝的产品代码。默认QUICK_WAP_WAY 表示是手机网站支付产品
                };
                //bizContent.Add("time_expire", "2022-08-01 22:00:00");  //订单绝对超时时间（优先启用），还有一个相对超时时间 timeout_express

                ////商品明细信息，按需传入
                //List<object> goodsDetails = new List<object>();
                //Dictionary<string, object> goods1 = new Dictionary<string, object>();
                //goods1.Add("goods_id", "goodsNo1");
                //goods1.Add("goods_name", "子商品1");
                //goods1.Add("quantity", 1);
                //goods1.Add("price", 0.01);
                //goodsDetails.Add(goods1);
                //bizContent.Add("goods_detail", goodsDetails);

                ////扩展信息，按需传入
                //Dictionary<string, object> extendParams = new Dictionary<string, object>();
                //extendParams.Add("sys_service_provider_id", "2088501624560335");
                //bizContent.Add("extend_params", extendParams);

                //3、发送请求及处理响应
                AlipayTradeWapPayRequest request = new AlipayTradeWapPayRequest();
                request.SetNotifyUrl(""); //通知：支付宝付款（成不成功），都会调用这个通知URL（是必须让支付宝能访问到的接口URL）
                request.SetReturnUrl("");  //回调：付款后回调的URL地址

                //打包参数
                string Contentjson = JsonConvert.SerializeObject(bizContent);
                request.BizContent = Contentjson;
                AlipayTradeWapPayResponse response = client.pageExecute(request);

                return Tuple.Create(true, response.Body);
            }
            catch (Exception ex)
            {
                return Tuple.Create(false, ex.Message);
            }
        }
    }
}
